package demo1;

class B {
    public B(){
        func();
    }

    public void func(){
        System.out.println("B.func()");
    }
}

class D extends B{
    private int num = 1;
    @Override
    public void func() {
        System.out.println("D.func()" + num);
    }
}

public class Test1 {
    public static void main(String[] args) {
        D d = new D(); //打印D.func() 0
    }
    //如果在父类的构造中调用子类重写的方法的时候，此时会调用子类重写的方法

    //构造D对象时会调用B的构造方法
    //B的构造中调用了func方法，出发动态绑定，会调用到D中的func
    //此时D对象还未构造，num未被初始化为1，所以num打印0
    //所以在构造函数类，应该尽量避免在构造方法里调用重写方法
}
